package biblio;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Observable;

/**
 * Classe de gestion d'un lecteur.
 * @author IUT, refactor� par E. Ceret
 * @version 2.0
 *
 */
public class Lecteur extends Observable implements Serializable {

	// ************************************************************************************************************
	// Constantes
	// ************************************************************************************************************

	private static final long serialVersionUID = 1L;
	private static int MAX_EMPRUNTS = 5; // nb max d'emprunts autoris�s par lecteur

	// ************************************************************************************************************
	// Attributs
	// ************************************************************************************************************
	private int _numero;
	private String _nom;
	private String _prenom;
	private String _adresse;
	private int _age;

	// Attributs d'Association
	private HashSet<Exemplaire> _emprunts;

	// ************************************************************************************************************
	// Constructeur
	// ************************************************************************************************************
	/**
	 * Constructeur.
	 * @param numero	num�ro du lecteur
	 * @param nom		nom du lecteur
	 * @param prenom	pr�nom du lecteur
	 * @param adresse	adresse du lecteur
	 * @param age		�ge du lecteur
	 */
	public Lecteur(int numero, String nom, String prenom, String adresse, int age) {
		this.setNumero(numero) ;
		this.setNom(nom);
		this.setPrenom(prenom);
		this.setAdresse(adresse);
		this.setAge(age);
		this.setEmprunts(new HashSet<Exemplaire>());
		
	} // Fin Constructeur

	// ************************************************************************************************************
	// M�thodes priv�es
	// ************************************************************************************************************

	// ------------------------------------------------------------------------------------------------------------
	// Affecteurs

	/**
	 * @param numero valeur � affecter comme num�ro du lecteur
	 */
	private void setNumero(int numero) {
		_numero = numero;
	}

	/**
	 * @param nom valeur � affecter comme nom du lecteur
	 */
	private void setNom(String nom) {
		_nom = nom;
	}

	/**
	 * @param prenom valeur � affecter comme pr�nom du lecteur
	 */
	private void setPrenom(String prenom) {
		_prenom = prenom;
	}

	/**
	 * @param adresse valeur � affecter comme adresse du lecteur
	 */
	private void setAdresse(String adresse) {
		_adresse = adresse;
	}

	/**
	 * @param age valeur � affecter comme �ge du lecteur
	 */
	private void setAge(int age) {
		_age = age;
	}
	
	/**
	 * @param emprunts collection � affecter comme ensemble d'emprunts du lecteur
	 */
	private void setEmprunts(HashSet<Exemplaire> emprunts) {
		_emprunts = emprunts;
	}

	// ************************************************************************************************************
	// M�thodes publiques
	// ************************************************************************************************************
	
	// ------------------------------------------------------------------------------------------------------------
	// Accesseurs
	
	/**
	 * @return le num�ro du lecteur
	 */
	public int getNumero() {
		return _numero;
	}

	/**
	 * @return le nom du lecteur
	 */
	public String getNom() {
		return _nom;
	}

	/**
	 * @return le pr�nom du lecteur
	 */
	public String getPrenom() {
		return _prenom;
	}

	/**
	 * @return l'adresse du lecteur
	 */
	public String getAdresse() {
		return _adresse;
	}

	/**
	 * @return l'�ge du lecteur
	 */
	public int getAge() {
		return _age;
	}

	/**
	 * @return la collection des emprunts du lecteur
	 */
	public HashSet<Exemplaire> getEmprunts() {
		return _emprunts;
		
	}
	// ------------------------------------------------------------------------------------------------------------
	// Pr�dicats d'Etat

	/**
	 * Calcule si le lecteur est NON satur� d'emprunts.
	 * @return un bool�en indiquant si le lecteur n'a PAS atteint son nombre maximal d'emprunts.
	 */
	public boolean estNonSature() {
		return (this.getEmprunts().size() < Lecteur.MAX_EMPRUNTS);
	}
} // Fin Classe Lecteur
